﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC_Hotel.Entidades;
using TCC_Hotel.Repositorio;
using System.Web.Caching;

namespace TCC_Hotel.Serviços.BDServices
{
    public class FuncionarioService
    {
        FuncionarioRepositorio repositorio = new FuncionarioRepositorio();


        /// <summary>
        /// Serviço para inserir um funcionario no banco
        /// </summary>
        /// <param name="funcionario">Funcionario que será inserido</param>
        /// <returns>True se foi inserido ou false se nao</returns>
        public bool CadastrarFuncionario(Funcionario funcionario)
        {
            return repositorio.CadastrarFuncionario(funcionario);
            
        }

        /// <summary>
        /// Serviço para listar todos os funcionarios do banco
        /// </summary>
        /// <returns>Lista com os funcionarios do banco</returns>
        public List<Funcionario> RecuperarFuncionarios()
        {
           return repositorio.RecuperarFuncionarios().OrderBy(i => i.Nome).ToList();

        }

        /// <summary>
        /// Serviço para listar os detalhes de um funcionario do banco 
        /// </summary>
        /// <returns>Lista com os funcionarios do banco</returns>
        public Funcionario RecuperarDetalhesFuncionario(string CPF)
        {
            return repositorio.RecuperarDetalhesFuncionario(CPF);

        }

        /// <summary>
        /// Serviço para listar os detalhes de um funcionario por usuario do banco 
        /// </summary>
        /// <returns>Lista com os funcionarios do banco</returns>
        public Funcionario RecuperarDetalhesFuncionarioPorUsuario(string usuario)
        {
            return repositorio.RecuperarDetalhesFuncionarioPorUsuario(usuario);

        }

        /// <summary>
        /// Serviço para listar os detalhes de um funcionario ativo por usuario do banco 
        /// </summary>
        /// <returns>Lista com os funcionarios do banco</returns>
        public Funcionario RecuperarDetalhesFuncionarioAtivoPorUsuario(string usuario)
        {
            return repositorio.RecuperarDetalhesFuncionarioAtivoPorUsuario(usuario);

        }

        /// <summary>
        /// Serviço para editar um funcionario do banco 
        /// </summary>
        /// <returns>true se editou e false se nao</returns>
        public bool EditarFuncionario(string CPF, Funcionario funcionario)
        {
            return repositorio.EditarFuncionario(CPF, funcionario);
        }

        /// <summary>
        /// trocar senha do funcionario
        /// </summary>
        /// <returns>true se trocou e false se nao</returns>
        public bool TrocarSenhaFuncionario(string Usuario, string NovaSenha)
        {
            return repositorio.TrocarSenhaFuncionario(Usuario, NovaSenha);
        }

        /// <summary>
        /// Serviço para desligar um funcionario do hotel 
        /// </summary>
        /// <returns>true se deslogpu e false se nao</returns
        public bool DesligarFuncionario(string CPF)
        {
            Funcionario funcionario = RecuperarDetalhesFuncionario(CPF);
            return repositorio.DesligarFuncionario(CPF, funcionario);
        }

        /// <summary>
        /// Serviço que verifica se o RG já está cadastrado
        /// </summary>
        /// <returns>true se editou e false se nao</returns>
        public bool VerificarRGCadastrado(string RG, string RGAtual = "0")
        {
            Funcionario funcionario = repositorio.RecuperarDetalhesFuncionarioPorRG(RG);
            if (funcionario != null)
            {
                if (funcionario.RG == RGAtual)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
                return true;
        }

        /// <summary>
        /// Serviço que verifica se o RG já está cadastrado
        /// </summary>
        /// <returns>true se editou e false se nao</returns>
        public bool VerificarUsuarioCadastrado(string Usuario)
        {
            Funcionario funcionario = RecuperarDetalhesFuncionarioPorUsuario(Usuario);
            if (funcionario != null)            
                return false;
            else
                return true;
        }

        /// <summary>
        /// Verifica se o PIS digitado é válido
        /// </summary>
        /// <param name="pis">PIS digitado</param>
        /// <returns>retorna se o PIS é válido ou não</returns>
        public bool ValidaPIS(string pis)
        {
            int[] multiplicador = new int[10] { 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int soma;
            int resto;

            if (pis.Trim().Length == 0)
                return false;

            pis = pis.Trim();
            pis = pis.Replace("-", "").Replace(".", "").PadLeft(11, '0');

            soma = 0;
            for (int i = 0; i < 10; i++)
                soma += int.Parse(pis[i].ToString()) * multiplicador[i];

            resto = soma % 11;
            
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;

            return pis.EndsWith(resto.ToString());


        }

        /// <summary>
        /// Serviço para listar todos os funcionarios ativos do banco
        /// </summary>
        /// <returns>Lista com os funcionarios do banco</returns>
        public List<Funcionario> ListarFuncionariosAtivosCache()
        {
            return ListarFuncionariosCache().Where(i=>i.Ativo==true).OrderBy(i => i.Nome).ToList();

        }

        /// <summary>
        /// Verifica se a informação ja esta gravada em cache, se tiver recupera, 
        /// senao faz a consulta e grava em cache
        /// </summary>
        /// <returns>Lista de funcionarios</returns>
        public List<Funcionario> ListarFuncionariosCache()
        {
            List<Funcionario> funcionarios = new List<Funcionario>();

            //Verifica se a informação esta guardada em cache
            if (HttpContext.Current.Cache.Get("Lista_Funcionario") == null)
            {
                //Consulta os funcionarios no banco
                funcionarios = RecuperarFuncionarios();

                //Armazena a lista de funcionario em cache de 1 minuto para evitar muitas consultas ao banco
                HttpContext.Current.Cache.Add("Lista_Funcionario", funcionarios, null,
                                 DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
                               
            }

           //caso essa informaçao ja estiver no cache
            else
            {
                //Resgata informação do cache
                funcionarios = (List<Funcionario>)HttpContext.Current.Cache.Get("Lista_Funcionario");

            }

            return funcionarios;
        }
    }
}